/**
 *  user 接口
 *  注册  /api/v1/register POST类型
 *  登录  /api/v1/login    POST类型
 *  个人信息 /api/v1/user  GET类型  用户id通过token获取
 */
const express = require('express')
// 字符串加密
const md5 = require('md5')
// 签发和验证token
const jsonwebtoken = require('jsonwebtoken')
// 加密的串 随机字符串
const secret = 'hellokkoottuu'
const router = express.Router()
// 导入user模型
const UserModel = require('../models/users')
// 加密中间件
const pwdCrypt = (req, res, next) => {
  // 获取源密码
  let password = req.body.password
  // 加密密码  salt加盐机密  加入一些额外的字符串
  password = md5(md5(password).slice(6, 12))
  // console.log(password)
  // console.log(password.length)
  // 将加密密码重新存回去
  req.body.password = password
  next()
}
// 注册  使用密码加密的自定义中间件
router.post('/register', pwdCrypt, (req, res) => {
  // 用户注册的信息
  let data = req.body
  // 判断用户已经存在[手机号或者用户名已经存在],则不注册
  UserModel.findOne({
    $or: [{ username: req.body.username }, { mobile: req.body.mobile }]
  })
    .then((rs) => {
      if (rs) {
        res.send({
          code: 2,
          msg: '请不要重复注册',
          data: {
            username: rs.username,
            mobile: rs.mobile,
            head_url: rs.head_url
          }
        })
      } else {
        UserModel.insertMany(data).then((rs) => {
          console.log(rs)
          if (rs.length > 0) {
            res.send({
              code: 0,
              msg: 'ok',
              data: {
                username: rs[0].username,
                mobile: rs[0].mobile,
                head_url: rs[0].head_url
              }
            })
          } else {
            res.send({
              code: 1,
              msg: 'register error',
              data: {}
            })
          }
        })
      }
    })
    .catch((e) => {
      console.log(e)
    })
})
// 登录 使用密码加密中间件  密码加密不可逆的  校验密码需要加密之后对比
router.post('/login', (req, res) => {
  let data = req.body
  UserModel.findOne(data).then((rs) => {
    if (rs) {
      res.send({
        code: 0,
        msg: 'ok',
        data: {
          username: rs.username,
          mobile: rs.mobile,
          head_url: rs.head_url,
          // token 登录成功之后 返回token
          // payload 参数  secret 密钥
          token: jsonwebtoken.sign(
            {
              uid: rs._id,
              expire: Math.ceil(new Date().getTime() / 1000) + 7200
            },
            // 加密的字符串  必须存储服务器端  不能发送给浏览器客户端
            secret
          )
        }
      })
    } else {
      res.send({
        code: 1,
        msg: '用户名|手机号或者密码错误',
        data: {}
      })
    }
  })
})
const checkToken = (req, res, next) => {
  // 获取客户端传递token headers authorization
  let token = req.headers.authorization
  // 校验token是否有效
  try {
    // try里面的代码执行 报错不会直接输出 捕获
    let payload = jsonwebtoken.verify(token, secret)
    req.payload = payload
  } catch (e) {
    // e try里面报错 通过e接收
    console.log(e)
    res.send({
      code: 1,
      msg: 'token错误,请重新登录获取token'
    })
  }
  next()
}
// 查询个人信息 token
// 先校验token有效性  自定义中间件
router.get('/user', checkToken, (req, res) => {
  // 根据用户携带的token进行获取个人信息
  UserModel.findOne({_id:req.payload.uid}).then((rs) => {
    if (rs) {
      res.send({
        code: 0,
        msg: 'ok',
        data: {
          username: rs.username,
          mobile: rs.mobile,
          head_url: rs.head_url,
          // token 登录成功之后 返回token
          // payload 参数  secret 密钥
          token: jsonwebtoken.sign(
            {
              uid: rs._id,
              expire: Math.ceil(new Date().getTime() / 1000) + 7200
            },
            // 加密的字符串  必须存储服务器端  不能发送给浏览器客户端
            secret
          )
        }
      })
    } else {
      res.send({
        code: 1,
        msg: '服务器错误~!',
        data: {}
      })
    }
  })
})
module.exports = router
